﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
using System.Reflection;
using System.Collections;

namespace nSin
{
    /// <summary>
    /// Interaction logic for InvioMail.xaml
    /// </summary>
    public partial class InvioMail : UserControl
    {
        public InvioMail()
        {
            InitializeComponent();
        }

        private void UserControl_Loaded(object sender, RoutedEventArgs e)
        {
            nSynDBDataSet nSynDBDataSet = new nSynDBDataSet();

            string selezione = ((ComboBoxItem)(TipoFiltro).SelectedValue).Content.ToString();
            if (selezione == "Provincie")
            {
                nSynDBDataSetTableAdapters.ProvincieTableAdapter myTableAdapter = new nSin.nSynDBDataSetTableAdapters.ProvincieTableAdapter();
                //nSynDBDataSet.UtentiDataTable myTable = new nSynDBDataSet.UtentiDataTable();
                myTableAdapter.Fill(nSynDBDataSet.Provincie);
                CreateGenericGridView<nSynDBDataSet.ProvincieDataTable>(nSynDBDataSet.Provincie, lsvData);

                lsvData.ItemsSource = nSynDBDataSet.Provincie;
            }
            else
            {
                nSynDBDataSetTableAdapters.SocietaTableAdapter myTableAdapter = new nSin.nSynDBDataSetTableAdapters.SocietaTableAdapter();
                //nSynDBDataSet.UtentiDataTable myTable = new nSynDBDataSet.UtentiDataTable();
                myTableAdapter.Fill(nSynDBDataSet.Societa);
                CreateGenericGridView<nSynDBDataSet.SocietaDataTable>(nSynDBDataSet.Societa, lsvData);

                lsvData.ItemsSource = nSynDBDataSet.Societa;
            }
        }
        private void CreateGenericGridView<T>(
    System.Data.DataTable objCol, ListView targetListView)
        {
            //PropertyInfo[] properties = typeof(T).GetProperties();
            //SortedDictionary<Int32, String> propertyCol =
            //    new SortedDictionary<int, string>();

            //foreach (PropertyInfo pi in properties)
            //{
            //    object[] customAtts = pi.GetCustomAttributes(true);
            //    foreach (object o in customAtts)
            //    {
            //        SortOrderAttribute soa = o
            //            as SortOrderAttribute;
            //        if (soa != null)
            //        {
            //            propertyCol.Add(soa.SortOrder, pi.Name);
            //            break;
            //        }
            //    }
            //}

            GridView gv = new GridView();
            //if (propertyCol.Count > 0)
            //{
            //SortedDictionary<Int32, String>.Enumerator enumerator =
            System.Collections.IEnumerator enumerator = objCol.Columns.GetEnumerator();

            while (enumerator.MoveNext())
            {
                AddGridViewColumn(gv, objCol,
                    enumerator.Current.ToString());
            }
            //}

            if (objCol is ICollection)
                targetListView.ItemsSource = objCol as ICollection;
            else
            {
                ArrayList al = new ArrayList();
                al.Add(objCol);
                targetListView.ItemsSource = al;
            }
            targetListView.View = gv;
        }
        private void AddGridViewColumn(
            GridView gv,
            object objToShow,
            String property)
        {
            GridViewColumn gvc = new GridViewColumn();
            gvc.Header = property;
            gvc.DisplayMemberBinding =
                CreateBinding(objToShow, property);
            gv.Columns.Add(gvc);
        }
        private Binding CreateBinding(object o, string path)
        {
            Binding b = new Binding(path);
            b.Source = o;
            return b;
        }

        private void TipoFiltro_SelectionChanged(object sender, SelectionChangedEventArgs e)
        {
            if (((ComboBoxItem)TipoFiltro.SelectedItem).Content != null)
            {
                nSynDBDataSet nSynDBDataSet = new nSynDBDataSet();
                string selezione = ((ComboBoxItem)((ComboBox)sender).SelectedValue).Content.ToString();
                if (selezione == "Provincie")
                {
                    nSynDBDataSetTableAdapters.ProvincieTableAdapter myTableAdapter = new nSin.nSynDBDataSetTableAdapters.ProvincieTableAdapter();
                    //nSynDBDataSet.UtentiDataTable myTable = new nSynDBDataSet.UtentiDataTable();
                    myTableAdapter.Fill(nSynDBDataSet.Provincie);
                    CreateGenericGridView<nSynDBDataSet.ProvincieDataTable>(nSynDBDataSet.Provincie, lsvData);

                    lsvData.ItemsSource = nSynDBDataSet.Provincie;
                }
                else
                {
                    nSynDBDataSetTableAdapters.SocietaTableAdapter myTableAdapter = new nSin.nSynDBDataSetTableAdapters.SocietaTableAdapter();
                    //nSynDBDataSet.UtentiDataTable myTable = new nSynDBDataSet.UtentiDataTable();
                    myTableAdapter.Fill(nSynDBDataSet.Societa);
                    CreateGenericGridView<nSynDBDataSet.SocietaDataTable>(nSynDBDataSet.Societa, lsvData);

                    lsvData.ItemsSource = nSynDBDataSet.Societa;
                }
            }
        }

        private void button1_Click(object sender, RoutedEventArgs e)
        {
            nSynDBDataSet myData = new nSynDBDataSet();
            nSynDBDataSetTableAdapters.ListaUtentiTableAdapter myTableAdapter = new nSin.nSynDBDataSetTableAdapters.ListaUtentiTableAdapter();

            //nSynDBDataSetTableAdapters = new nSin.nSynDBDataSetTableAdapters.SocietaTableAdapter();

            int myResult = myTableAdapter.Fill(myData.ListaUtenti, DateTime.Parse("2008-09-10"), "ISCRITTI");
            StringBuilder listaEmailUtenti = new StringBuilder();
            foreach (nSynDBDataSet.ListaUtentiRow unUtente in myData.ListaUtenti)
            {
                listaEmailUtenti.Append(unUtente.Email + ";");
            }
            int posizioneIndirizzo = 0;
            int contaPosizione = 0;
            const int dimensioneMassimaStringaIndirizzi = 1710;
            string indirizziEmail = listaEmailUtenti.ToString();
            StringBuilder elencoMail = new StringBuilder();
            // suddividi l'elenco di indirizzi in modo da non superare il limite della stringa mailto:
            int totaleEmail = 0;
            int numeroEmail = 0;
            while (posizioneIndirizzo != indirizziEmail.Length)
            {
                if (indirizziEmail.Length > dimensioneMassimaStringaIndirizzi)
                // se la lunghezza della stringa degli indirizzi è maggiore di quella ammissibile -> spezza
                {
                    for (int i = 1710; i > 0; i--)
                        if (indirizziEmail[i] == ';')
                        {
                            posizioneIndirizzo = i + 1;
                            break;
                        };
                }
                else
                    posizioneIndirizzo = indirizziEmail.Length;

                System.Diagnostics.Trace.WriteLine("Invio email utenti per newsletter " + indirizziEmail.Substring(0, posizioneIndirizzo));
                System.Diagnostics.Process.Start("mailto:" + "newsletter@silceasondrio.org" + 
                        "?bcc=" + indirizziEmail.Substring(0, posizioneIndirizzo) +
                        "&subject=Sindacato SILCEA: nuovo volantino" +
                        "&body=http://www.silceasondrio.org"  +
                        "* email a carattere sindacale. " +
                        "Ricevi questa email in quanto sei iscritto alla nostra newsletter. " +
                        "Se non vuoi più riceverla rispondi a questa email mettendo la parola \"cancellazione\" nell'oggetto.");
                numeroEmail = (indirizziEmail.Substring(0, posizioneIndirizzo).Length - indirizziEmail.Substring(0, posizioneIndirizzo).Replace(";", "").Length);
                elencoMail.Append("Inviata mail di " +  numeroEmail + " occorrenze" + Environment.NewLine);
                totaleEmail += numeroEmail;
                if (posizioneIndirizzo != indirizziEmail.Length)
                    indirizziEmail = indirizziEmail.Substring(posizioneIndirizzo + 1);
                
            }
            MessageBox.Show("Totale email inviate: " + totaleEmail + Environment.NewLine + elencoMail.ToString());
        }
    }
    public class SortOrderAttribute : Attribute
    {
        public Int32 SortOrder { get; set; }

        public SortOrderAttribute(Int32 sortOrder)
        {
            SortOrder = sortOrder;
        }
    }
}
